// cf-55d
// 题意：定义beautiful number为一个数可以整除其每一位非零数字。现在给定
//       一个[L, R]区间(1<=l<=r<=10^18)，问其中beautiful number的个数。
//
// 题解：不错的数位dp。首先我们可以想到beautiful number就是满足该数可以
//       整除所有非零位的lcm。那么我们可以根据lcm的余数来定义状态，
//       dp[i][r][m][l]表示从高到低前i位，余数是r，用了m个数字(0~9)，l
//       表示是否严格小于上界，（如果严格小当前位可以从0～9, 否则只能
//       从0～上届的当前位）从0到上届一共有多少个。
//       lcm最多只有9*8*7*5=2520。但是mask状态很多。我们可以考虑用匹配到
//       当前位的lcm来替换，最多只有4*3*2*2=48个lcm，
//       （最大是2^3 * 3^2 * 5^1 * 7^1），可以先做个离散化和预处理。
//       最后结果就是匹配完所有位，余数r % lcm状态m = 0就可以加入到答案中。
//
//       还可以有一些优化，比如利用5最低位只能是0, 5等。
//       不过我做了预处理好像就够过了。
//
// run: time -p $exec < input
#include <iostream>
#include <algorithm>
#include <vector>

int const maxl = 22;
int const maxm = 2520;

long long f[maxl][maxm + 4][50][2]; // last is mark of strictly less, 1 for true
int a[maxl];
std::vector<int> alcm;
long long plcm[maxm + 4][10];
long long kth[maxm + 4];
long long l, r;

int gcd(int x, int y) { return !y ? x : gcd(y, x % y); }

int lcm(int x, int y)
{
	if (!x) return y;
	if (!y) return x;
	return x * y / gcd(x, y);
}

void init()
{
	for (int i2 = 0, t2 = 1; i2 < 4; i2++, t2 *= 2)
		for (int i3 = 0, t3 = 1; i3 < 3; i3++, t3 *= 3)
			for (int i5 = 0, t5 = 1; i5 < 2; i5++, t5 *= 5)
				for (int i7 = 0, t7 = 1; i7 < 2; i7++, t7 *= 7)
					alcm.push_back(t2 * t3 * t5 * t7);
	std::sort(alcm.begin(), alcm.end());
	for (int i = 0; i <= maxm; i++)
		for (int j = 0; j < 10; j++) plcm[i][j] = lcm(i, j);
	for (int i = 0; i < (int)alcm.size(); i++)
		kth[alcm[i]] = i;
}

int get_len(long long x)
{
	int ret = 0;
	for (; x; x /= 10) a[ret++] = x % 10;
	return ret;
}

long long calc(long long x)
{
	int n = get_len(x);
	for (int i = 0; i <= n; i++)
		for (int j = 0; j < maxm; j++)
			for (int k = 0; k < (int)alcm.size(); k++)
				for (int l = 0; l < 2; l++) f[i][j][k][l] = 0;
	f[0][0][0][0] = 1;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < maxm; j++)
			for (int k = 0; k < (int)alcm.size(); k++)
				for (int l = 0; l < 2; l++) {
					if (!f[i][j][k][l]) continue;
					int up = (l ? 9 : a[n - i - 1]);
					for (int ti = 0; ti <= up; ti++) {
						int last = l || (ti < a[n - i - 1]);
						f[i + 1][(j * 10 + ti) % maxm][kth[plcm[alcm[k]][ti]]][last]
							+= f[i][j][k][l];
					}
				}
	long long ans = 0;
	for (int i = 0; i < maxm; i++)
		for (int k = 0; k < (int)alcm.size(); k++)
			for (int l = 0; l < 2; l++)
				if (!(i % alcm[k])) ans += f[n][i][k][l];
	return ans;
}

int main()
{
	std::ios::sync_with_stdio(false);
	init();
	int T; std::cin >> T;
	while (T--) {
		std::cin >> l >> r;
		std::cout << calc(r) - calc(l - 1) << '\n';
	}
}

